package fr.univ.projet.ihm;

import fr.univ.projet.Grille;
import fr.univ.projet.Jeu;
import fr.univ.projet.Joueur;
import fr.univ.projet.Numero;
import fr.univ.projet.data.Base;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class PanelJeux extends javax.swing.JPanel {

    private JFrame parent;

    /**
     * Creates new form PanelJeux
     * 
     * @param parent Fenetre parent qui va contenir le panel
     */
    public PanelJeux(JFrame parent) {
        this.parent = parent;
        affichage();
    }

    /**
     * Permet d'initialiser les valeurs des différents composants du panel :
     *    - Tri les jeu en fonction de leur état ( fini ou en cours )
     *    - Initialise les grilles déjà jouées par le joueur
     */
    private void affichage() {
        Base base = Base.getInstance();
        Joueur jConnecte = base.getJoueurConnecte();
        initComponents();
        List<Jeu> lstJeuDispo = new ArrayList<Jeu>();
        List<Jeu> lstJeuFait = new ArrayList<Jeu>();

        for (int i = 0; i < base.getLstJeu().size(); i++) {
            Jeu jeu = base.getLstJeu().get(i);
            if (jeu.isTirageFait()) {
                lstJeuFait.add(jeu);
            } else {
                lstJeuDispo.add(jeu);
            }
        }

        List<Grille> listGrille = new ArrayList<Grille>(jConnecte.getGrilles().values());

        this.lblNom.setText(jConnecte.getNom());
        this.lstJeuFini.setListData(lstJeuFait.toArray());
        this.lstJeu.setListData(lstJeuDispo.toArray());
        this.lstGrilleJ.setListData(listGrille.toArray());
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        btnDeco = new javax.swing.JButton();
        lblNom = new javax.swing.JLabel();
        jScrollPane2 = new javax.swing.JScrollPane();
        lstJeu = new javax.swing.JList();
        lblJeuDispo = new javax.swing.JLabel();
        btnJouer = new javax.swing.JButton();
        lblJeuFini = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        lstJeuFini = new javax.swing.JList();
        btnVuTirage = new javax.swing.JButton();
        lblGrille = new javax.swing.JLabel();
        jScrollPane3 = new javax.swing.JScrollPane();
        lstGrilleJ = new javax.swing.JList();
        btnGain = new javax.swing.JButton();
        btnGainTotal = new javax.swing.JButton();

        btnDeco.setBackground(javax.swing.UIManager.getDefaults().getColor("Button.background"));
        btnDeco.setText("Déconnexion");
        btnDeco.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnDecoActionPerformed(evt);
            }
        });

        lblNom.setText("jLabel1");

        lstJeu.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        jScrollPane2.setViewportView(lstJeu);

        lblJeuDispo.setText("Liste des jeux dispoibles");

        btnJouer.setText("Jouer");
        btnJouer.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnJouerActionPerformed(evt);
            }
        });

        lblJeuFini.setText("Liste des jeux terminés");

        jScrollPane1.setViewportView(lstJeuFini);

        btnVuTirage.setText("Voir tirage");
        btnVuTirage.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnVuTirageActionPerformed(evt);
            }
        });

        lblGrille.setText("Liste des grilles jouées");

        jScrollPane3.setViewportView(lstGrilleJ);

        btnGain.setText("Voir gain");
        btnGain.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnGainActionPerformed(evt);
            }
        });

        btnGainTotal.setText("Voir gains totaux");
        btnGainTotal.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnGainTotalActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(113, 113, 113)
                        .addComponent(lblJeuFini))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(169, 169, 169)
                        .addComponent(btnJouer))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(158, 158, 158)
                        .addComponent(btnVuTirage))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(121, 121, 121)
                        .addComponent(lblGrille))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(85, 85, 85)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(layout.createSequentialGroup()
                                .addGap(12, 12, 12)
                                .addComponent(btnGainTotal)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(btnGain))
                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                .addGroup(layout.createSequentialGroup()
                                    .addGap(26, 26, 26)
                                    .addComponent(lblJeuDispo))
                                .addComponent(jScrollPane2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 212, Short.MAX_VALUE)
                                .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
                                .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)))))
                .addContainerGap(119, Short.MAX_VALUE))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(lblNom)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btnDeco)
                .addGap(8, 8, 8))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(58, 58, 58)
                        .addComponent(lblJeuDispo, javax.swing.GroupLayout.PREFERRED_SIZE, 17, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnJouer))
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(btnDeco)
                        .addComponent(lblNom)))
                .addGap(18, 18, 18)
                .addComponent(lblJeuFini)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btnVuTirage)
                .addGap(31, 31, 31)
                .addComponent(lblGrille)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, 76, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnGain)
                    .addComponent(btnGainTotal))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
    }// </editor-fold>//GEN-END:initComponents

    /**
     * Action permettant au joueur de se deconnecter de son compte
     * 
     * @param evt 
     */
    private void btnDecoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDecoActionPerformed
        parent.setContentPane(new PanelConnexion(parent));
        parent.pack();
    }//GEN-LAST:event_btnDecoActionPerformed

    /**
     * Action permettant d'avoir la grille du jeu désiré
     * 
     * @param evt 
     */
    private void btnJouerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnJouerActionPerformed
        Jeu jeuSelectionne = (Jeu) lstJeu.getSelectedValue();

        if (jeuSelectionne == null) {
            JOptionPane.showMessageDialog(PanelJeux.this, "Il faut sélectionner un jeu!", "Erreur", JOptionPane.ERROR_MESSAGE);
        } else {
            this.parent.setContentPane(new PanelGrille(this.parent, jeuSelectionne));
        }

    }//GEN-LAST:event_btnJouerActionPerformed

    /**
     * Bouton permettant au joueur de connaitre le tirage du jeu sélectionné
     * 
     * @param evt 
     */
    private void btnVuTirageActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnVuTirageActionPerformed
        Jeu jeuSelectionne = (Jeu) lstJeuFini.getSelectedValue();
        if (jeuSelectionne == null) {
            JOptionPane.showMessageDialog(PanelJeux.this, "Il faut sélectionner un jeu!", "Erreur", JOptionPane.ERROR_MESSAGE);
        } else {
            Map<String, Object> resultat = jeuSelectionne.getMapResult();
            List<Numero> listNumG = (List<Numero>) resultat.get(Jeu.CODE_MAP_NUMS_GAGNANTS);

            StringBuilder sb = new StringBuilder();
            sb.append("Numéros gagnants : ");
            for (Numero n : listNumG) {
                sb.append(n.getValeur());
                sb.append(", ");
            }

            if (jeuSelectionne.getNbreNumeroChance() > 0) {
                Numero numChanceG = (Numero) resultat.get(Jeu.CODE_MAP_NUM_CHANCE);
                sb.append("\n");
                sb.append("Numéro chance : ");

                sb.append(numChanceG.getValeur());

            }

            JOptionPane.showMessageDialog(this, sb.toString(), "Resultat tirage du jeu : " + jeuSelectionne.toString(), JOptionPane.INFORMATION_MESSAGE);
        }
    }//GEN-LAST:event_btnVuTirageActionPerformed

    /**
     * Action permettant au joueur de connaitre ses gains totaux
     * 
     * @param evt 
     */
    private void btnGainTotalActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnGainTotalActionPerformed
        Base base = Base.getInstance();
        Joueur j = base.getJoueurConnecte();
        
        if ( j.getGrilles().isEmpty() )
        {
               JOptionPane.showMessageDialog(this, "Aucune grille de jouée!", "Gains", JOptionPane.INFORMATION_MESSAGE);
        }
        else
        {
            float gain = j.gainTotal();
            
            // test si tous les jeux ont eut leur tirage
            Collection<Grille> listGrille = j.getGrilles().values();
            int nbG = 0;
            for( Grille g : listGrille)
            {
                if ( g.getJeu().isTirageFait() )
                    nbG++;
            }
            
            if ( nbG == listGrille.size())
                JOptionPane.showMessageDialog(this, "Votre gain total est de  : " + gain, "Gains", JOptionPane.INFORMATION_MESSAGE);
            else if (nbG == 0)
                JOptionPane.showMessageDialog(this, "Aucune grille jouée n' a eu son tirage effectué", "Gains", JOptionPane.INFORMATION_MESSAGE);
            else
                JOptionPane.showMessageDialog(this, "Votre gain total est de  : " + gain + "\n (tous les jeux n'ont pas encore eut leur tirage de fait)", "Gains", JOptionPane.INFORMATION_MESSAGE);
        }
    }//GEN-LAST:event_btnGainTotalActionPerformed

    /**
     * Action permettant au joueur de connaitre les gains d'une grille
     * @param evt 
     */
    private void btnGainActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnGainActionPerformed

        Grille grille = (Grille) lstGrilleJ.getSelectedValue();

        Base base = Base.getInstance();
        Joueur jCo = base.getJoueurConnecte();

        if (grille != null) {

            float gain = jCo.estGagnante(grille.getCode());

            JOptionPane.showMessageDialog(this, "Votre gain pour la grille n°" + grille.getCode() + " est de  : " + gain, "Gains", JOptionPane.INFORMATION_MESSAGE);
        } else {

            JOptionPane.showMessageDialog(PanelJeux.this, "Il faut sélectionner une grille!", "Erreur", JOptionPane.ERROR_MESSAGE);
        }


    }//GEN-LAST:event_btnGainActionPerformed
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnDeco;
    private javax.swing.JButton btnGain;
    private javax.swing.JButton btnGainTotal;
    private javax.swing.JButton btnJouer;
    private javax.swing.JButton btnVuTirage;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JLabel lblGrille;
    private javax.swing.JLabel lblJeuDispo;
    private javax.swing.JLabel lblJeuFini;
    private javax.swing.JLabel lblNom;
    private javax.swing.JList lstGrilleJ;
    private javax.swing.JList lstJeu;
    private javax.swing.JList lstJeuFini;
    // End of variables declaration//GEN-END:variables
}